/**
 * 数据操作文件模块
 * 操作文件中的数据，只处理数据，不关心业务
 */

const fs = require('fs')
const dbPath = './db.json'

/**
 * 获取所有学生列表
 * return []
 */
exports.find = (callback) => {
    fs.readFile(dbPath,'utf8',(err,data) => {
        if(err) return callback(err)
        callback(null,JSON.parse(data).students)
    })
}

/**
 * 获取单个学生
 * return []
 */
exports.findBI = (id,callback) => {
    fs.readFile(dbPath,'utf8',(err,data) => {
        if(err) return callback(err)
        let students = JSON.parse(data).students
        let stu = students.find((item) => {
            return item.id === parseInt(id)
        })
        callback(null,stu)
    })
}

 /**
 * 添加学生
 */
exports.save = (item,callback) => {
    fs.readFile(dbPath,'utf8',(err,data) => {
        if(err) return callback(err)
        let students = JSON.parse(data).students
        item.id = students[students.length - 1].id + 1
        students.push(item)
        let ii = JSON.stringify({students:students})
        fs.writeFile(dbPath,ii,(err,data) => {
            if (err) throw err;
            callback(null)
        })
    })
}

 /**
 * 编辑学生
 */
exports.edit = (student,callback) => {
    fs.readFile(dbPath,'utf8',(err,data) => {
        if(err) return callback(err)
        let students = JSON.parse(data).students
        //这个会将原本的内容替换掉。student需要是传进来的完整的内容
        // students = students.map(item => item.id === student.id ? student : item)
        student.id = parseInt(student.id)
        let stu = students.find((item) => {
            return item.id === student.id
        })
        //这个是将传进来的键值对根据key值进行对比，然后将相同内容更新，未变的内容不动
        for(let key in student){
            stu[key] = student[key]
        }
        let ii = JSON.stringify({students:students})
        fs.writeFile(dbPath,ii,(err,data) => {
            if (err) throw err;
            callback(null)
        })
    })
}

 /**
 * 删除学生
 */
exports.delete = (id,callback) => {
    fs.readFile(dbPath,'utf8',(err,data) => {
        if(err) return callback(err)
        let students = JSON.parse(data).students
        //es6:用null替换掉对象、过滤掉数组中的所有的null
        students = students.map(item => item.id === parseInt(id) ? null : item)
        students = students .filter((item) => item !== null);

        // let deledeId = students.findIndex((item) => {
        //     return item.id === parseInt(id)
        // })
        // students.splice(deledeId,1)
        let ii = JSON.stringify({students:students})
        fs.writeFile(dbPath,ii,(err,data) => {
            if (err) throw err;
            callback(null)
        })
    })
}

